package com.easyfile.easyfilemaster.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import com.easyfile.easyfilemaster.entity.UserInfo;
import io.jsonwebtoken.*;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * JWT工具类
 * @author chenpeman
 */
public class JwtUtil {
    /**过期时间*/
    private static final int EXPIRES = 12;
    /**时间单位*/
    private static final DateField DEFAULT_TIMEUNIT = DateField.MONTH;
    /**加密密匙*/
    private static final String KEY="chenpeman";

    /**
     * 生成token
     *
     * @param userInfo 用户信息
     * @return token
     */
    public static String createToken(UserInfo userInfo){
        try{
            return Jwts.builder()
                    //id
                    .setId(UUID.randomUUID().toString())
                    //载荷
                    .addClaims(BeanUtil.beanToMap(userInfo))
                    //过期时间
                    .setExpiration(DateUtil.date().offset(DEFAULT_TIMEUNIT,EXPIRES))
                    //签名
                    .signWith(SignatureAlgorithm.HS256,KEY)
                    .compact();
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 检查token是否合法
     * 返回token中用户信息
     * @param token token
     * @return 用户信息
     */
    public static UserInfo checkToken(String token){
        try{
            //解析token
            Claims body = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
            UserInfo userInfo = new UserInfo();
            //对象转换
            BeanUtil.copyProperties(body,userInfo);
            return userInfo;
        }catch (Exception e){
            return null;
        }
    }

    /**
     * 检验token是否合法
     *
     * @param token the token
     * @return the boolean
     */
    public static boolean checkTokenAccess(String token){
        try{
            //解析token
            Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
            return true;
        }catch (Exception e){
            return false;
        }
    }

    public static Long getUserIdByToken(String token){
        try{
            Claims body = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
            return (Long) body.get("id");
        }catch (Exception e){
            return null;
        }
    }
}
